﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace JoomlaXMLEditor
{
    // edytor elementów szablonu
    public partial class TemplateElementEditor : Form
    {
        // typ dodawanego elementu
        public string type;
        // uchwyt do nadrzędnego okna
        public TemplateParameters parent;
        // indeks przy edycji
        public int index;
        // konstruktor
        public TemplateElementEditor(string type, TemplateParameters parent, int index)
        {
            this.type = type;
            this.parent = parent;
            this.index = index;

            InitializeComponent();

            // parsowanie elementu
            if (index != -1)
            {
                XmlElement node = (XmlElement) this.parent.parameters[index];
                if(node.HasAttribute("type")) this.type = node.Attributes["type"].Value;
                if (node.HasAttribute("name")) this.textBox1.Text = node.Attributes["name"].Value;
                if (node.HasAttribute("label")) this.textBox3.Text = node.Attributes["label"].Value;

                foreach (XmlAttribute attr in node.Attributes)
                {
                    if (attr.Name != "type" && attr.Name != "name" && attr.Name != "label")
                    {
                        this.richTextBox1.AppendText(((this.richTextBox1.Lines.Count() > 0) ? "\r\n" : "") + attr.Name + "=" + attr.Value);
                    }
                }

                foreach (XmlElement child in node.ChildNodes)
                {
                    this.richTextBox1.AppendText(((this.richTextBox1.Lines.Count() > 0) ? "\r\n" : "") + child.Name + "=" + child.InnerText + ":" + child.Attributes["value"].Value);
                }
            }
        }
        // zamykanie
        private void button7_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        // zapisywanie
        private void button6_Click(object sender, EventArgs e)
        {
            if (this.textBox1.Text != "" && this.textBox3.Text != "")
            {
                XmlElement node = this.parent.parent.actualFile.CreateElement("param");

                XmlAttribute attr1 = this.parent.parent.actualFile.CreateAttribute("name");
                XmlAttribute attr2 = this.parent.parent.actualFile.CreateAttribute("type");
                XmlAttribute attr3 = this.parent.parent.actualFile.CreateAttribute("label");

                attr1.Value = this.textBox1.Text;
                attr2.Value = this.type;
                attr3.Value = this.textBox3.Text;

                node.Attributes.Append(attr1);
                node.Attributes.Append(attr2);
                node.Attributes.Append(attr3);

                bool error = false;

                foreach (String line in this.richTextBox1.Lines)
                {
                    if (!line.Contains("="))
                    {
                        error = true;

                        String[] temp = line.Split('=');

                        if (temp.Length != 2)
                        {
                            error = true;
                        }
                    }
                    else
                    {
                        String[] tempArr = line.Split('=');
                        if(tempArr[0] == "option")
                        {
                            String[] tmp = tempArr[1].Split(':');
                            XmlElement opt = this.parent.parent.actualFile.CreateElement("option");
                            XmlText textNode = this.parent.parent.actualFile.CreateTextNode(tmp[0]);
                            opt.AppendChild(textNode);
                            XmlAttribute attr = this.parent.parent.actualFile.CreateAttribute("value");
                            if (tmp.Length > 1)
                            {
                                attr.Value = tmp[1];
                                opt.Attributes.Append(attr);
                                node.AppendChild(opt);
                            }
                            else 
                            {
                                error = true;
                            }
                        }
                        else
                        {
                            if(node.HasAttribute(tempArr[0]))
                            {
                                error = true;
                            }
                            else
                            {
                                XmlAttribute attr = this.parent.parent.actualFile.CreateAttribute(tempArr[0]);
                                attr.Value = tempArr[1];
                                node.Attributes.Append(attr);
                            }
                        }
                    }
                }

                if (error)
                {
                    MessageBox.Show("Składnia dodatkowych parametrów jest niepoprawna (Poprawna składnia: 'parametr=wartość' a w wypadku opcji: 'option=tekst:wartość') lub parametry powtarzają się.");
                }
                else
                {
                    if (index != -1)
                    {
                        this.parent.listBox1.Items[index] = this.textBox1.Text + " ( " + this.type + " )";
                        this.parent.parameters[index] = node;
                    }
                    else
                    {
                        this.parent.listBox1.Items.Add(this.textBox1.Text + " ( " + this.type + " )");
                        this.parent.parameters.Add(node);
                    }

                    this.Close();
                }
            }
            else
            {
                MessageBox.Show("Proszę wypełnić wymagane pola formularza");
            }
        }
    }
}
